<!DOCTYPE html>
<html lang=zh>
<head><meta name="generator" content="Hexo 3.9.0">
  <meta charset="utf-8">
  
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, minimal-ui">
  <meta name="renderer" content="webkit">
  <meta http-equiv="Cache-Control" content="no-transform">
  <meta http-equiv="Cache-Control" content="no-siteapp">
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="apple-mobile-web-app-status-bar-style" content="black">
  <meta name="format-detection" content="telephone=no,email=no,adress=no">
  <!-- Color theme for statusbar -->
  <meta name="theme-color" content="#000000">
  <!-- 强制页面在当前窗口以独立页面显示,防止别人在框架里调用页面 -->
  <meta http-equiv="window-target" content="_top">
  
  
  <title>Java集合框架系统学习 | 山岚 - 90码农历险记</title>
  <meta name="description" content="写在前面：什么是Java集合-What？ Java集合是Java编程语言自带的功能。存放于java.util包下； Java集合其实可以分为三个小类：Set、List、Map 集合最大的目的是用来存储数据用的，不过存储的是数据的引用，也可以理解是内存地址。集合主要是便于开发者对数据进行增删改查等等操作，所以才会有“集合”这种东西。  为什么要学习集合-Why？ 笼统的说，学习集合最终是为了更好的开">
<meta name="keywords" content="java集合框架">
<meta property="og:type" content="article">
<meta property="og:title" content="Java集合框架系统学习">
<meta property="og:url" content="https://blog.gobyte.cn/post/57eede11.html">
<meta property="og:site_name" content="山岚博客">
<meta property="og:description" content="写在前面：什么是Java集合-What？ Java集合是Java编程语言自带的功能。存放于java.util包下； Java集合其实可以分为三个小类：Set、List、Map 集合最大的目的是用来存储数据用的，不过存储的是数据的引用，也可以理解是内存地址。集合主要是便于开发者对数据进行增删改查等等操作，所以才会有“集合”这种东西。  为什么要学习集合-Why？ 笼统的说，学习集合最终是为了更好的开">
<meta property="og:locale" content="zh-CN">
<meta property="og:image" content="https://ws4.sinaimg.cn/large/96e311f0gy1g4nxy8vttgj20i80bu41o.jpg">
<meta property="og:image" content="https://wx2.sinaimg.cn/large/96e311f0gy1g4qaxur2a4j208k057t92.jpg">
<meta property="og:updated_time" content="2019-12-10T08:14:59.812Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Java集合框架系统学习">
<meta name="twitter:description" content="写在前面：什么是Java集合-What？ Java集合是Java编程语言自带的功能。存放于java.util包下； Java集合其实可以分为三个小类：Set、List、Map 集合最大的目的是用来存储数据用的，不过存储的是数据的引用，也可以理解是内存地址。集合主要是便于开发者对数据进行增删改查等等操作，所以才会有“集合”这种东西。  为什么要学习集合-Why？ 笼统的说，学习集合最终是为了更好的开">
<meta name="twitter:image" content="https://ws4.sinaimg.cn/large/96e311f0gy1g4nxy8vttgj20i80bu41o.jpg">
  <!-- Canonical links -->
  <link rel="canonical" href="https://blog.gobyte.cn/post/57eede11.html">
  
    <link rel="alternate" href="/atom.xml" title="山岚博客" type="application/atom+xml">
  
  
    <link rel="icon" href="/shan-2.png" type="image/x-icon">
  
  <link rel="stylesheet" href="/css/style.css">
  
  
  
  
</head>


<body class="main-center theme-black" itemscope itemtype="http://schema.org/WebPage">
  <header class="header" itemscope itemtype="http://schema.org/WPHeader">
  <div class="slimContent">
    <div class="navbar-header">
      
      
      <div class="profile-block text-center">
        <a id="avatar" href="https://github.com/shanlanCoding" target="_blank">
          <img class="img-circle img-rotate" src="/images/ha-002-small.png" width="200" height="200">
        </a>
        <h2 id="name" class="hidden-xs hidden-sm">山岚</h2>
        <h3 id="title" class="hidden-xs hidden-sm hidden-md">半吊子全栈开发者</h3>
        <small id="location" class="text-muted hidden-xs hidden-sm"><i class="icon icon-map-marker"></i> Work in 0755; Home is in 0713</small>
      </div>
      
      <div class="search" id="search-form-wrap">

    <form class="search-form sidebar-form">
        <div class="input-group">
            <input type="text" class="search-form-input form-control" placeholder="搜索" />
            <span class="input-group-btn">
                <button type="submit" class="search-form-submit btn btn-flat" onclick="return false;"><i class="icon icon-search"></i></button>
            </span>
        </div>
    </form>
    <div class="ins-search">
  <div class="ins-search-mask"></div>
  <div class="ins-search-container">
    <div class="ins-input-wrapper">
      <input type="text" class="ins-search-input" placeholder="想要查找什么..." x-webkit-speech />
      <button type="button" class="close ins-close ins-selectable" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
    </div>
    <div class="ins-section-wrapper">
      <div class="ins-section-container"></div>
    </div>
  </div>
</div>


</div>
      <button class="navbar-toggle collapsed" type="button" data-toggle="collapse" data-target="#main-navbar" aria-controls="main-navbar" aria-expanded="false">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
    </div>
    <nav id="main-navbar" class="collapse navbar-collapse" itemscope itemtype="http://schema.org/SiteNavigationElement" role="navigation">
      <ul class="nav navbar-nav main-nav menu-highlight">
        
        
        <li class="menu-item menu-item-home">
          <a href="/.">
            
            <i class="icon icon-home-fill"></i>
            
            <span class="menu-title">首页</span>
          </a>
        </li>
        
        
        <li class="menu-item menu-item-archives">
          <a href="/archives/">
            
            <i class="icon icon-archives-fill"></i>
            
            <span class="menu-title">归档</span>
          </a>
        </li>
        
        
        <li class="menu-item menu-item-categories">
          <a href="/categories/">
            
            <i class="icon icon-folder"></i>
            
            <span class="menu-title">分类</span>
          </a>
        </li>
        
        
        <li class="menu-item menu-item-tags">
          <a href="/tags/">
            
            <i class="icon icon-tags"></i>
            
            <span class="menu-title">标签</span>
          </a>
        </li>
        
        
        <li class="menu-item menu-item-links">
          <a href="/links/">
            
            <i class="icon icon-friendship"></i>
            
            <span class="menu-title">友链</span>
          </a>
        </li>
        
      </ul>
      
	
    <ul class="social-links">
    	
        <li><a href="https://github.com/shanlanCoding" target="_blank" title="Github" data-toggle=tooltip data-placement=top><i class="icon icon-github"></i></a></li>
        
        <li><a href="http://mail.qq.com/cgi-bin/qm_share?t=qm_mailme&email=CWRgen1se2phZnxJeHgnamZk" target="_blank" title="Email" data-toggle=tooltip data-placement=top><i class="icon icon-email"></i></a></li>
        
    </ul>

    </nav>
  </div>
</header>

  
    <aside class="sidebar" itemscope itemtype="http://schema.org/WPSideBar">
  <div class="slimContent">
    
      <div class="widget">
    <h3 class="widget-title">公告</h3>
    <div class="widget-body">
        <div id="board">
            <div class="content">
                <p>欢迎交流与分享经验，知无不言言无不尽!</p>
            </div>
        </div>
    </div>
</div>

    
      
  <div class="widget">
    <h3 class="widget-title">分类</h3>
    <div class="widget-body">
      <ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/categories/Java/">Java</a><span class="category-list-count">4</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/JavaScript/">JavaScript</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/windows/">windows</a><span class="category-list-count">2</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/前端/">前端</a><span class="category-list-count">9</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/博客优化/">博客优化</a><span class="category-list-count">7</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/变得更好/">变得更好</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/心情/">心情</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/手机/">手机</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/服务器/">服务器</a><span class="category-list-count">3</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/求职/">求职</a><span class="category-list-count">4</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/骚操作/">骚操作</a><span class="category-list-count">3</span></li></ul>
    </div>
  </div>


    
      
  <div class="widget">
    <h3 class="widget-title">标签</h3>
    <div class="widget-body">
      <ul class="tag-list"><li class="tag-list-item"><a class="tag-list-link" href="/tags/AutoJs/">AutoJs</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Git/">Git</a><span class="tag-list-count">3</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Hexo/">Hexo</a><span class="tag-list-count">5</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Java/">Java</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/JavaScript/">JavaScript</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Java面试题/">Java面试题</a><span class="tag-list-count">4</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/React/">React</a><span class="tag-list-count">6</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/React教程/">React教程</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/centOS/">centOS</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/java基础/">java基础</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/java集合框架/">java集合框架</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/linux/">linux</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/nginx/">nginx</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/vue/">vue</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/windows-10/">windows 10</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/人脸识别/">人脸识别</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/博客优化/">博客优化</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/吐槽/">吐槽</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/小米6/">小米6</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/思维改变/">思维改变</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/自定义手机号/">自定义手机号</a><span class="tag-list-count">1</span></li></ul>
    </div>
  </div>


    
      
  <div class="widget">
    <h3 class="widget-title">标签云</h3>
    <div class="widget-body tagcloud">
      <a href="/tags/AutoJs/" style="font-size: 13.2px;">AutoJs</a> <a href="/tags/Git/" style="font-size: 13.4px;">Git</a> <a href="/tags/Hexo/" style="font-size: 13.8px;">Hexo</a> <a href="/tags/Java/" style="font-size: 13px;">Java</a> <a href="/tags/JavaScript/" style="font-size: 13.2px;">JavaScript</a> <a href="/tags/Java面试题/" style="font-size: 13.6px;">Java面试题</a> <a href="/tags/React/" style="font-size: 14px;">React</a> <a href="/tags/React教程/" style="font-size: 13px;">React教程</a> <a href="/tags/centOS/" style="font-size: 13px;">centOS</a> <a href="/tags/java基础/" style="font-size: 13px;">java基础</a> <a href="/tags/java集合框架/" style="font-size: 13px;">java集合框架</a> <a href="/tags/linux/" style="font-size: 13px;">linux</a> <a href="/tags/nginx/" style="font-size: 13.2px;">nginx</a> <a href="/tags/vue/" style="font-size: 13px;">vue</a> <a href="/tags/windows-10/" style="font-size: 13px;">windows 10</a> <a href="/tags/人脸识别/" style="font-size: 13px;">人脸识别</a> <a href="/tags/博客优化/" style="font-size: 13px;">博客优化</a> <a href="/tags/吐槽/" style="font-size: 13px;">吐槽</a> <a href="/tags/小米6/" style="font-size: 13px;">小米6</a> <a href="/tags/思维改变/" style="font-size: 13px;">思维改变</a> <a href="/tags/自定义手机号/" style="font-size: 13px;">自定义手机号</a>
    </div>
  </div>

    
      
  <div class="widget">
    <h3 class="widget-title">归档</h3>
    <div class="widget-body">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/12/">十二月 2019</a><span class="archive-list-count">2</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/11/">十一月 2019</a><span class="archive-list-count">4</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/10/">十月 2019</a><span class="archive-list-count">2</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/09/">九月 2019</a><span class="archive-list-count">1</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/08/">八月 2019</a><span class="archive-list-count">11</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/07/">七月 2019</a><span class="archive-list-count">9</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/06/">六月 2019</a><span class="archive-list-count">9</span></li></ul>
    </div>
  </div>


    
      
  <div class="widget">
    <h3 class="widget-title">最新文章</h3>
    <div class="widget-body">
      <ul class="recent-post-list list-unstyled no-thumbnail">
        
          <li>
            
            <div class="item-inner">
              <p class="item-category">
                <a class="category-link" href="/categories/前端/">前端</a>
              </p>
              <p class="item-title">
                <a href="/post/7080982b.html" class="title">AntD的一个警告解决方法：defaultvalue is invalid for getfielddecorator will set value please use option.initialvalue instead</a>
              </p>
              <p class="item-date">
                <time datetime="2019-12-07T08:58:03.000Z" itemprop="datePublished">2019-12-07</time>
              </p>
            </div>
          </li>
          
          <li>
            
            <div class="item-inner">
              <p class="item-category">
                <a class="category-link" href="/categories/JavaScript/">JavaScript</a>
              </p>
              <p class="item-title">
                <a href="/post/cbc43a97.html" class="title">海信A5自动阅读打卡签到工具软件脚本</a>
              </p>
              <p class="item-date">
                <time datetime="2019-12-06T09:03:39.000Z" itemprop="datePublished">2019-12-06</time>
              </p>
            </div>
          </li>
          
          <li>
            
            <div class="item-inner">
              <p class="item-category">
                <a class="category-link" href="/categories/JavaScript/">JavaScript</a>
              </p>
              <p class="item-title">
                <a href="/post/ae3d322e.html" class="title"> AutoJs获取的Text文本是乱码|Android爬虫反字体屏蔽乱码解决方案 </a>
              </p>
              <p class="item-date">
                <time datetime="2019-11-23T03:50:19.000Z" itemprop="datePublished">2019-11-23</time>
              </p>
            </div>
          </li>
          
          <li>
            
            <div class="item-inner">
              <p class="item-category">
                <a class="category-link" href="/categories/服务器/">服务器</a>
              </p>
              <p class="item-title">
                <a href="/post/1a22163b.html" class="title">GitHub克隆clone太慢添加代理加速访问</a>
              </p>
              <p class="item-date">
                <time datetime="2019-11-13T03:51:13.000Z" itemprop="datePublished">2019-11-13</time>
              </p>
            </div>
          </li>
          
          <li>
            
            <div class="item-inner">
              <p class="item-category">
                <a class="category-link" href="/categories/心情/">心情</a>
              </p>
              <p class="item-title">
                <a href="/post/d90e4430.html" class="title">奇葩公司每周晚上占用下班时间开会、团建（跑步）</a>
              </p>
              <p class="item-date">
                <time datetime="2019-11-11T06:36:16.000Z" itemprop="datePublished">2019-11-11</time>
              </p>
            </div>
          </li>
          
      </ul>
    </div>
  </div>
  

    
  </div>
</aside>

  
  
<aside class="sidebar sidebar-toc collapse" id="collapseToc" itemscope itemtype="http://schema.org/WPSideBar">
  <div class="slimContent">
    <nav id="toc" class="article-toc">
      <h3 class="toc-title">文章目录</h3>
      <ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#写在前面："><span class="toc-number">1.</span> <span class="toc-text">写在前面：</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#什么是Java集合-What？"><span class="toc-number">1.0.1.</span> <span class="toc-text">什么是Java集合-What？</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#为什么要学习集合-Why？"><span class="toc-number">1.0.2.</span> <span class="toc-text">为什么要学习集合-Why？</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#如何学习集合-How？"><span class="toc-number">1.0.3.</span> <span class="toc-text">如何学习集合-How？</span></a></li></ol></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#集合框架的两大分类："><span class="toc-number">2.</span> <span class="toc-text">集合框架的两大分类：</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#Collection集合类"><span class="toc-number">3.</span> <span class="toc-text">Collection集合类</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#List集合"><span class="toc-number">3.1.</span> <span class="toc-text">List集合</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#ArrayList"><span class="toc-number">3.1.0.1.</span> <span class="toc-text">ArrayList</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#Vector（已过时）"><span class="toc-number">3.1.0.2.</span> <span class="toc-text">Vector（已过时）</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#LInkedList"><span class="toc-number">3.1.0.3.</span> <span class="toc-text">LInkedList</span></a></li></ol></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Set集合"><span class="toc-number">3.2.</span> <span class="toc-text">Set集合</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#HashSet"><span class="toc-number">3.2.0.1.</span> <span class="toc-text">HashSet</span></a><ol class="toc-child"><li class="toc-item toc-level-5"><a class="toc-link" href="#LinkedHashSet"><span class="toc-number">3.2.0.1.1.</span> <span class="toc-text">LinkedHashSet</span></a></li></ol></li><li class="toc-item toc-level-4"><a class="toc-link" href="#TreeSet"><span class="toc-number">3.2.0.2.</span> <span class="toc-text">TreeSet</span></a></li></ol></li></ol></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#Collection体系的总结："><span class="toc-number">4.</span> <span class="toc-text">Collection体系的总结：</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#问：Hash表是如何保证元素唯一性？"><span class="toc-number">4.0.1.</span> <span class="toc-text">问：Hash表是如何保证元素唯一性？</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#问：HashSet存储的步骤："><span class="toc-number">4.0.2.</span> <span class="toc-text">问：HashSet存储的步骤：</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#问：如何重写HashCode方法："><span class="toc-number">4.0.3.</span> <span class="toc-text">问：如何重写HashCode方法：</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#问：如何重写equals方法："><span class="toc-number">4.0.4.</span> <span class="toc-text">问：如何重写equals方法：</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#重写equals-而不重写hashCode-的风险"><span class="toc-number">4.0.5.</span> <span class="toc-text">重写equals()而不重写hashCode()的风险</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#我让hashCode-每次都返回一个固定的数行吗？"><span class="toc-number">4.0.6.</span> <span class="toc-text">我让hashCode()每次都返回一个固定的数行吗？</span></a></li></ol></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#Map集合"><span class="toc-number">5.</span> <span class="toc-text">Map集合</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#HashMap"><span class="toc-number">5.0.0.1.</span> <span class="toc-text">HashMap</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#LinkedHashMap"><span class="toc-number">5.0.0.2.</span> <span class="toc-text">LinkedHashMap</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#HashTable"><span class="toc-number">5.0.0.3.</span> <span class="toc-text">HashTable</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#TreeMap"><span class="toc-number">5.0.0.4.</span> <span class="toc-text">TreeMap</span></a></li></ol></li></ol></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#脚注"><span class="toc-number">6.</span> <span class="toc-text">脚注</span></a></li></ol>
    </nav>
  </div>
</aside>

<main class="main" role="main">
  <div class="content">
  <article id="post-Java集合框架复习01" class="article article-type-post" itemscope itemtype="http://schema.org/BlogPosting">
    
    <div class="article-header" name="标题头部>
      
        
  
    <h1 class="article-title" itemprop="name">
      Java集合框架系统学习
    </h1>
  

      
      <div class="article-meta">
        <span class="article-date">
    <i class="icon icon-calendar-check"></i>
	<a href="/post/57eede11.html" class="article-date">
	  <time datetime="2019-07-04T09:23:55.000Z" itemprop="datePublished">2019-07-04</time>
	</a>
</span>
        
  <span class="article-category">
    <i class="icon icon-folder"></i>
    <a class="article-category-link" href="/categories/Java/">Java</a>
  </span>

        
  <span class="article-tag">
    <i class="icon icon-tags"></i>
	<a class="article-tag-link" href="/tags/java集合框架/">java集合框架</a>
  </span>


        
	<span class="article-read hidden-xs">
	    <i class="icon icon-eye-fill" aria-hidden="true"></i>
	    <span id="busuanzi_container_page_pv">
			<span id="busuanzi_value_page_pv">0</span>
		</span>
	</span>


	<span class="article-read hidden-xs">
    	<i class="icon icon-eye-fill" aria-hidden="true"></i>
    	<span id="/post/57eede11.html" class="leancloud_visitors"  data-flag-title="Java集合框架系统学习">
			<span class="leancloud-visitors-count">0</span>
		</span>
    </span>

        <span class="post-comment"><i class="icon icon-comment"></i> <a href="/post/57eede11.html#comments" class="article-comment-link">评论</a></span>
        
      </div>
    </div>
    <div class="article-entry marked-body" itemprop="articleBody" name="正文">
      
        <h1 id="写在前面："><a href="#写在前面：" class="headerlink" title="写在前面："></a>写在前面：</h1><h3 id="什么是Java集合-What？"><a href="#什么是Java集合-What？" class="headerlink" title="什么是Java集合-What？"></a>什么是Java集合-What？</h3><ol>
<li>Java集合是Java编程语言自带的功能。存放于java.util包下；</li>
<li>Java集合其实可以分为三个小类：Set、List、Map</li>
<li>集合最大的目的是用来存储数据用的，不过存储的是数据的引用，也可以理解是内存地址。集合主要是便于开发者对数据进行增删改查等等操作，所以才会有“集合”这种东西。</li>
</ol>
<h3 id="为什么要学习集合-Why？"><a href="#为什么要学习集合-Why？" class="headerlink" title="为什么要学习集合-Why？"></a>为什么要学习集合-Why？</h3><ol>
<li>笼统的说，学习集合最终是为了更好的开发程序</li>
<li>不负责任的说，是为了考试、面试</li>
</ol>
<h3 id="如何学习集合-How？"><a href="#如何学习集合-How？" class="headerlink" title="如何学习集合-How？"></a>如何学习集合-How？</h3><ol>
<li><p>学习集合的特点</p>
</li>
<li><p>学习集合的使用方法</p>
</li>
<li><p>学习集合的构成原理</p>
</li>
</ol>
<p>这里我仅复习1和3，至于2需要在实际开发中渐进式学习。</p>
<p>学习集合框架，更多的是在于理解基础概念，再慢慢结合到实际编码中，<strong>所以少不了记忆</strong>。</p>
<h1 id="集合框架的两大分类："><a href="#集合框架的两大分类：" class="headerlink" title="集合框架的两大分类："></a>集合框架的两大分类：</h1><p>Java集合框架可分为两大类<code>Collection</code>和<code>Map</code>，两者区别如下：</p>
<ol>
<li><p>Collection是单列集合；Map是双列集合 </p>
</li>
<li><p>Collection中只有Set系列要求元素唯一；Map中键唯一，值可以重复</p>
</li>
<li><p>Collection的数据结构是针对元素的；Map的数据结构是针对键</p>
<p><img src="//ws4.sinaimg.cn/large/96e311f0gy1g4nxy8vttgj20i80bu41o.jpg" alt="集合框架体系图"></p>
</li>
</ol>
<h1 id="Collection集合类"><a href="#Collection集合类" class="headerlink" title="Collection集合类"></a>Collection集合类</h1><p>Collection ：<strong>是一个集合接口</strong>。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。</p>
<p>Collections：<strong>是一个包装类</strong>。它包含有各种有关集合操作的<strong>静态多态方法</strong>。此类<strong>不能实例化</strong>，就像一<strong>个工具类</strong>，服务于Java的Collection框架。</p>
<hr>
<p>如上图，Collection体系分为两大类：Set 和 List。例如以下Java代码使用工具类collections实现排序功能，当然还有很多其他功能</p>
<h2 id="List集合"><a href="#List集合" class="headerlink" title="List集合"></a>List集合</h2><p><strong>List特点：存取有顺序；有下标索引；可以根据索引进行取值；元素也可以重复</strong></p>
<h4 id="ArrayList"><a href="#ArrayList" class="headerlink" title="ArrayList"></a>ArrayList</h4><p><strong>线程不同步；底层原理是数组；</strong>初始容量为10，当数组大小不足时，会自动扩充当前容量的1.5倍+1。ArrayList的元素内存地址是连续的，所以查询速度快。由于增删需要挪动数组内的数据，所以增删速度慢。为追求效率，ArrayList没有实现同步锁（synchronize）。若需要同步，可以手动添加同步锁，也可以用<strong>Vector代替</strong>。注意，Vector已经过时。</p>
<h4 id="Vector（已过时）"><a href="#Vector（已过时）" class="headerlink" title="Vector（已过时）"></a>Vector（已过时）</h4><p><strong>线程同步，但是效率低；</strong>容量不足时，默认扩充当前容量的一倍。</p>
<h4 id="LInkedList"><a href="#LInkedList" class="headerlink" title="LInkedList"></a>LInkedList</h4><p><strong>线程不同步；双向链表实现；</strong>查询慢，增删快。查询慢是因为底层采用链表数据结构，而链表的内存地址不连续，所以查询慢。增删快是因为在增删时，不需要移动元素，只需要改变相关元素的头尾指针地址值。可以用来模拟栈和队列，栈是先进后出，而队列是先进先出。</p>
<p>LinkedList同时实现了List和Deque接口，可以将它看做一个顺序的容器，也可以看成一个<a href="https://baike.baidu.com/item/队列/14580481" target="_blank" rel="noopener">队列（Deque）</a>[^队列Deque]，同时还能看做成一个<a href="https://baike.baidu.com/item/%E6%A0%88/12808149" target="_blank" rel="noopener">栈（Stack）</a><a href="栈是限定仅在表尾进行插入和删除操作的线性表。要搞清楚这个概念，首先要明白”栈“原来的意思，如此才能把握本质。" 栈“者,存储货物或供旅客住宿的地方,可引申为仓库、中转站，所以引入到计算机领域里，就是指数据暂时存储的地方，所以才有进栈、出栈的说法。">^栈Stack</a>。如果这样的话，LinkedList将是一个全能的超人。当你需要使用栈（Stack）和队列（Deque）时，可以考虑使用LinkedList，一方面是因为Java官方已经声明不建议使用Stack类，更遗憾的是Java里根本没有一个叫做Deque的类（Deque是接口）。关于栈（stack）或队列（Deque），现在的首选是ArrayDeque，它有着比LinkedList（当栈stack和队列Deque使用时）更好的性能。</p>
<h2 id="Set集合"><a href="#Set集合" class="headerlink" title="Set集合"></a>Set集合</h2><p><strong>特点：存取无序；不可以重复；没有下标。</strong></p>
<h4 id="HashSet"><a href="#HashSet" class="headerlink" title="HashSet"></a>HashSet</h4><p><strong>线程不同步，存取速度快</strong>，内部使用HashMap进行存储数据，且提供的方法基本都是调用HashMap的方法。所以两者本质相同，元素可以为Null。</p>
<p>Hash表是通过HashCode和equals方法保证唯一性。</p>
<p>Hash表存储元素的过程：首先根据被存储的元素来计算出HashCode值，然后根据计算出的HashCode值和数组的长度进行计算出存储的下标；如果该下标位置没有元素，则直接存储。如果有元素，直接用equals方法将被存入的元素和已有的元素进行对比，若结果为真则放弃储存。如果为假，则以链表的形式进行存储。</p>
<p><strong>HashCode如何计算</strong>，请看这里：[如何重写HashCode方法](# 问：如何重写HashCode方法：)</p>
<h5 id="LinkedHashSet"><a href="#LinkedHashSet" class="headerlink" title="LinkedHashSet"></a>LinkedHashSet</h5><p>链表+Hash技术进行存储的，根据HashCode决定插入的位置，使用链表来维护次序。所以存取有序，又因为需要维护元素的顺序，所以比HashSet效率低；线程不安全</p>
<h4 id="TreeSet"><a href="#TreeSet" class="headerlink" title="TreeSet"></a>TreeSet</h4><p><strong>线程不同步，底层原理使用二叉树结构<a href="一个节点下面不能多于两个节点，[具体参见百度百科](https://baike.baidu.com/item/二叉树/1602879)。二叉树的存储过程：如果是第一个元素，将直接存入，并作为根节点。下一个元素存入之前，会和根元素比较大小，如果大于根节点则放在该节点的右边，小于则放在左边，等于就放弃不储存。后面的元素将按照上面的规则执行，直到找到合适的位置为止。">^1</a>，存储自然顺序[^2]，</strong>元素唯一，内部使用TreeMap的SortedSet。</p>
<p>TreeSet保证元素唯一性的两种方法：</p>
<ol>
<li><p>自定义对象实现接口<code>Comparable</code>的<code>comparaTo</code>方法，该方法返回0表示相等，小于0表示准备存入的元素比被比较的元素小，否则大于0。</p>
</li>
<li><p>在创建TreesSet的时候向构造器中传入比较器<code>Comparator</code>接口的实现类，实现<code>Comparator</code>接口重写<code>compara</code>方法。 </p>
<p>注意：如果存入自定义对象的时候，自定义类没有实现接口<code>Comparable</code>的<code>comparaTo</code>方法。或者也没有传入比较器<code>Comparator</code>，程序将会报错<code>ClassCastException</code>异常</p>
</li>
</ol>
<h1 id="Collection体系的总结："><a href="#Collection体系的总结：" class="headerlink" title="Collection体系的总结："></a>Collection体系的总结：</h1><p><strong>List ：存取有序，元素有索引，元素可以重复</strong></p>
<p>ArrayList：数组结构，查询快，增删慢，由于线程不安全，所以效果比较高。</p>
<p>Vector：数组结构，查询快，增删慢，由于是线程安全，所以效率不如ArrayList</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">addFirst()    removeFirst()    getFirst()</span><br></pre></td></tr></table></figure>

<p><strong>Set：存取无序，元素没有索引，元素不重复</strong></p>
<p>HashSet：存储无序，没有索引，元素不允许重复，底层由Hash表实现</p>
<p>TreeSet：存取无序，强制性排序，元素不能重复。</p>
<p>TreeSet有两种排序方式：</p>
<ul>
<li><p>自然排序：</p>
<p>TreeSet允许存入某些基础类型，它可以对这些类型自动升序排序[^2]</p>
</li>
<li><p>比较器排序-自定义排序：</p>
<p>如果要存入自定义的对象，则必须实现<code>Comparable</code>接口，覆盖它的<code>compareTo()</code>方法[^3]</p>
</li>
</ul>
<hr>
<h3 id="问：Hash表是如何保证元素唯一性？"><a href="#问：Hash表是如何保证元素唯一性？" class="headerlink" title="问：Hash表是如何保证元素唯一性？"></a>问：Hash表是如何保证元素唯一性？</h3><p>​    答：底层是依赖HashCode和equals。先将元素的HashCode计算出来，然后再使用equals进行对比元素。只有比对后不一致才开始存储，相等则放弃储存。</p>
<h3 id="问：HashSet存储的步骤："><a href="#问：HashSet存储的步骤：" class="headerlink" title="问：HashSet存储的步骤："></a>问：HashSet存储的步骤：</h3><p>​    若存储的是自定义对象，需要在对象内重写HashCode和equals方法。因为HashSet存储时，会先调用HashCode方法来计算该对象的Hash值。然被存入的对象Hash值与已有的Hash值相同，则继续调用equals方法，equals方法的作用是对比两个对象，若结果相等，则放弃存储。否则在已有的对象下用链表形式存储。</p>
<h3 id="问：如何重写HashCode方法："><a href="#问：如何重写HashCode方法：" class="headerlink" title="问：如何重写HashCode方法："></a>问：如何重写HashCode方法：</h3><p>​    通常在自定义HashCode的时候，只需要让当前对象的某个变动的值来关联一个随机数或者一个常量就可以，参考代码如下：</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">HashCode</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="comment">// 这里的99你可以根据你的喜好随便改一个整数，例如11，22都行</span></span><br><span class="line">	<span class="keyword">int</span> result = <span class="number">99</span>;</span><br><span class="line">    <span class="comment">// 避免字段为空程序异常，所以先行判断</span></span><br><span class="line">	result = result * <span class="number">13</span> + (name == <span class="keyword">null</span> ? <span class="number">0</span> : name.hashCode());</span><br><span class="line">	result = result * <span class="number">13</span> + (sex == <span class="keyword">null</span> ? <span class="number">0</span> : sex.hashCode() );</span><br><span class="line">	result = result * <span class="number">13</span> + (grade == <span class="keyword">null</span> ? <span class="number">0</span> : grade.hashCode() );</span><br><span class="line">	result = result * <span class="number">13</span> + age;</span><br><span class="line">	<span class="keyword">return</span> result;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<h3 id="问：如何重写equals方法："><a href="#问：如何重写equals方法：" class="headerlink" title="问：如何重写equals方法："></a>问：如何重写equals方法：</h3><p>​    由于是自定义方法，至于如何保证两个元素相等这取决于开发者。举例现在定义了个Student类，这个类代表一个学生，如何判断两个学生对象是同一个学生？这就取决于开发者的要求了，若开发者认为只要学生的：姓名、年龄、性别、班级全部都相同时，认为是同一个人。此时在Student对象类里，重写equals方法，而equals应该去判断：姓名、年龄、性别、班级这些是否相等，从而返回一个布尔型Boolean的结果，实例代码如下：</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">equals</span><span class="params">(Object obj)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="comment">// 1. 判断是否等于自身.</span></span><br><span class="line">    <span class="keyword">if</span>( <span class="keyword">this</span> == obj )</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line">    <span class="comment">// 2. 使用instanceof运算符判断 Obj 是否为Student类型的对象.</span></span><br><span class="line">    <span class="keyword">if</span>( !(obj <span class="keyword">instanceof</span> Student ) ) <span class="comment">// 当是同一个类型，则不进入if</span></span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">false</span>;</span><br><span class="line">    <span class="comment">// 3.比较Student中的字段，判断值是否相同</span></span><br><span class="line">	Student newS = (Student) obj; <span class="comment">//由于在步骤2的时候就已经判断是否为同类，若不是同类直接返回false，而程序也终止了，只有是同类型的时候才会走到这一行代码，所以不必要担心代码强转异常。</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment">// 最后比较数据</span></span><br><span class="line">	retrun <span class="keyword">this</span>.name.equals(newS.name) &amp;&amp; <span class="keyword">this</span>.age == newS.age &amp;&amp; </span><br><span class="line">        <span class="keyword">this</span>.grade.equals(newS.grade) &amp;&amp; <span class="keyword">this</span>.Sex.equals(newS.equals);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<h3 id="重写equals-而不重写hashCode-的风险"><a href="#重写equals-而不重写hashCode-的风险" class="headerlink" title="重写equals()而不重写hashCode()的风险"></a>重写equals()而不重写hashCode()的风险</h3><p>在Oracle的Hash Table实现中引用了Bucket的概念．如下图所示：</p>
<p><img src="//wx2.sinaimg.cn/large/96e311f0gy1g4qaxur2a4j208k057t92.jpg" alt="Bucket"></p>
<p>从上图可以看出，带Bucket的HashTable大致相当于hash表和链表的结合体。即在每一个Bucket上挂一个链表，链表的每个节点都用来存放对象。Java通过hashCode()方法来确定某个对象应该位于哪个Bucket桶中，然后在对应的链表中查找。理想情况下，如果的HashCode()写的足够健壮，那么每个Bucket将会只有一个节点，这样就解决了查找操作的常量级别的时间复杂度，即无论你的对象放在哪片内存中，我们都可以通过HashCode()立刻定位到该区域，而不需要从头到尾遍历查找，这也是hash表的最主要的作用。</p>
<p>如：当我们调用HashSet的put(Object o)方法时，首先会根据o.hashCode()的返回值定位到相应的Bucket中，如果该Bucket中没有结点，则将 o 放到这里，如果已经有结点了, 则把 o 挂到链表末端。同理，当调用contains(Object o)时，Java会通过hashCode()的返回值定位到相应的Bucket中，然后再在对应的链表中的结点依次调用equals()方法来判断结点中的对象是否是你想要的对象。</p>
<p>不重写HashCode会导致<strong>相同内容的一个对象，在取出时为null。</strong>原因就是虽然两个对象内容相同，但是由于没有重写HashCode方法，导致默认调用Object类的HashCode方法，返回了对象的地址，而两个对象虽然内容是相同，但是地址不同，那么新的对象就去一个不存在bucket里寻找，自然是返回null。</p>
<p>参考自：[重写equal()时为什么也得重写hashCode()之深度解</p>
<h3 id="我让hashCode-每次都返回一个固定的数行吗？"><a href="#我让hashCode-每次都返回一个固定的数行吗？" class="headerlink" title="我让hashCode()每次都返回一个固定的数行吗？"></a>我让hashCode()每次都返回一个固定的数行吗？</h3><p>示例代码：</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">hashCode</span><span class="params">()</span> </span>&#123;</span><br><span class="line">	<span class="keyword">return</span> <span class="number">10</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p>如果这样，每次都返回相同的数值，那么HashMap、HashSet就失去了它应有的“哈希的意义”。用<code>&lt;Effective Java&gt;</code>中的话来说就是，哈希表退化成了链表．如果hashCode()每次都返回相同的数，那么所有的对象都会被放到同一个Bucket中，每次执行查找操作都会遍历链表，这样就完全失去了哈希的作用．所以我们最好还是提供一个健壮的hashCode()为妙．</p>
<p>参考自：<a href="https://blog.csdn.net/neosmith/article/details/17068365" target="_blank" rel="noopener">如何重写hashCode()和equals()方法</a></p>
<hr>
<h1 id="Map集合"><a href="#Map集合" class="headerlink" title="Map集合"></a>Map集合</h1><p>Map是一个双列集合，其中保存的是键值对，键要求保持唯一性，值也可以重复。</p>
<p>键值是一一对应，一个键只能对应一个值。</p>
<p><strong>Map的特点：</strong>存取无序，键不可重复。Map在存储对象的时候，将键传入Entry，然后存储Entry对象</p>
<h4 id="HashMap"><a href="#HashMap" class="headerlink" title="HashMap"></a>HashMap</h4><p><strong>线程不同步，键唯一且，键值均允许Null，值可重复</strong>，根据<code>Key</code>来计算<code>HashCode</code>进行存储。内部使用静态内部类<code>Node</code>的数组进行存储，默认初始长度是16，每次扩大当前容量的一倍。当发生Hash冲突时，采用链表进行存储。</p>
<p>在JDK1.8中：当单个桶Bucket中的元素个数大于8个时，链表实现改为红黑树实现；当元素个数小于6时，变回链表实现。由此来防止HashCode攻击。</p>
<ul>
<li><p>Java HashMap 采用的是冲突链表方式。</p>
</li>
<li><p>HashMap 是 Hashtable 的轻量级实现，可以接受为 null 的键值 (key) 和值 (value)，而 Hashtable 不允许。</p>
<h4 id="LinkedHashMap"><a href="#LinkedHashMap" class="headerlink" title="LinkedHashMap"></a>LinkedHashMap</h4><p><strong>保存插入的顺序</strong>，在用iteration遍历LinkedHashMap时，先得到的记录肯定是最先插入的。也可以在构造时代入参数，按照应用次数进行排序。在遍历时会比HashMap慢，不过有种情况例外，当HashMap容量很大，实际数据很少是，遍历起来可能会比LinkedHashMap慢。因为LinkedHashMap的遍历速度只和实际数据有关，和容量无关，而HashMap的遍历是和它的容量有关。</p>
</li>
</ul>
<h4 id="HashTable"><a href="#HashTable" class="headerlink" title="HashTable"></a>HashTable</h4><p>HashMap和它类似，随着Java发布它就一起发布了。而HashMap是JDK1.2才出现的。</p>
<p>它是线程安全，HashMap是线程不安全。而且它的键值都不允许存入Null。</p>
<h4 id="TreeMap"><a href="#TreeMap" class="headerlink" title="TreeMap"></a>TreeMap</h4><p>存入自定义对象为Key时，由于底层使用了二叉树，所以存入的对象都需要排序，若要排序，就需要有比较功能。所以自定义对象应该实现<code>Comparable</code>接口，或者给TreeMap对象传递一个<code>Comparator</code>接口。</p>
<hr>
<h1 id="脚注"><a href="#脚注" class="headerlink" title="脚注"></a>脚注</h1><p>[^队列Deque]: 队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队，从队列中删除一个队列元素称为出队。因为队列只允许在一端插入，在另一端删除，所以只有最早进入队列的元素才能最先从队列中删除，故队列又称为先进先出（FIFO—first in first out）<a href="https://baike.baidu.com/item/线性表" target="_blank" rel="noopener">线性表</a>。</p>
<p>[^2]: 自然排序：TreeSet内部默认使用了一个Java自带的方法<code>java.lang.compareTo(e1, e2)</code>进行比较大小，最后以升序进行排列。可以比较的类型是<code>Byte</code>，<code>Double</code>，<code>Integer</code>，<code>Float</code>，<code>Long</code>或<code>Short</code>，若存入的是这些类型，则会自动排序，所以也叫自然排序。<br>[^3]:定制排序：若存入的是自定义对象，则无法进行比较大小，需要在自定义的类里实现<code>Comparable</code>接口，覆盖<code>compareTo</code>比较方法，自定义比较的规则。比较时需要创建第三方类，实现<code>Comparator</code>接口，并且覆其中的<code>Compare()</code>方法，编写比较规则和排序方式。</p>

      
    </div>

    <div class="article-footer" name="文章脚部">
      <blockquote class="mt-2x">
  <ul class="post-copyright list-unstyled">
    
    <li class="post-copyright-link hidden-xs">
      <strong>本文链接：</strong>
      <a href="https://blog.gobyte.cn/post/57eede11.html" title="Java集合框架系统学习" target="_blank" rel="external">https://blog.gobyte.cn/post/57eede11.html</a>
    </li>
    
    <li class="post-copyright-license">
      <strong>版权声明： </strong> 本博客所有文章除特别声明外，均采用 <a href="http://creativecommons.org/licenses/by/4.0/deed.zh" target="_blank" rel="external">CC BY 4.0 CN协议</a> 许可协议。转载请注明出处！
    </li>
  </ul>
</blockquote>


<div class="panel panel-default panel-badger">
  <div class="panel-body">
    <figure class="media">
      <div class="media-left">
        <a href="https://github.com/shanlanCoding" target="_blank" class="img-burn thumb-sm visible-lg">
          <img src="/images/ha-002-small.png" class="img-rounded w-full" alt="">
        </a>
      </div>
      <div class="media-body">
        <h3 class="media-heading"><a href="https://github.com/shanlanCoding" target="_blank"><span class="text-dark">山岚</span><small class="ml-1x">半吊子全栈开发者</small></a></h3>
        <div>大龄萌新；新时代福娃；喜欢东搞西搞；对待问题有独到的见解；</div>
      </div>
    </figure>
  </div>
</div>


    </div>
  </article>
  
    
  <section id="comments">
  	
      <div id="vcomments"></div>
    
  </section>


  
</div>

  <nav class="bar bar-footer clearfix" data-stick-bottom>
  <div class="bar-inner">
  
  <ul class="pager pull-left">
    
    <li class="prev">
      <a href="/post/6669b4ec.html" title="2019-2020届-Java应届生面试题总结，附带真实面试记录"><i class="icon icon-angle-left" aria-hidden="true"></i><span>&nbsp;&nbsp;上一篇</span></a>
    </li>
    
    
    <li class="next">
      <a href="/post/47dfb631.html" title="Java面试复习巩固"><span>下一篇&nbsp;&nbsp;</span><i class="icon icon-angle-right" aria-hidden="true"></i></a>
    </li>
    
    
    <li class="toggle-toc">
      <a class="toggle-btn collapsed" data-toggle="collapse" href="#collapseToc" aria-expanded="false" title="文章目录" role="button">
        <span>[&nbsp;</span><span>文章目录</span>
        <i class="text-collapsed icon icon-anchor"></i>
        <i class="text-in icon icon-close"></i>
        <span>]</span>
      </a>
    </li>
    
  </ul>
  
  
  
  <div class="bar-right">
    
  </div>
  </div>
</nav>
  



  	<script>
	  <!-- 百度站长自动推送链接 -->
		(function(){
		var bp = document.createElement('script');
		var curProtocol = window.location.protocol.split(':')[0];
		if (curProtocol === 'https') {
			bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
		}
		else {
			bp.src = 'http://push.zhanzhang.baidu.com/push.js';
		}
		var s = document.getElementsByTagName("script")[0];
		s.parentNode.insertBefore(bp, s);
		})();
	</script>
</main>

  <footer class="footer" itemscope itemtype="http://schema.org/WPFooter">
	
	
    <ul class="social-links">
    	
        <li><a href="https://github.com/shanlanCoding" target="_blank" title="Github" data-toggle=tooltip data-placement=top><i class="icon icon-github"></i></a></li>
        
        <li><a href="http://mail.qq.com/cgi-bin/qm_share?t=qm_mailme&email=CWRgen1se2phZnxJeHgnamZk" target="_blank" title="Email" data-toggle=tooltip data-placement=top><i class="icon icon-email"></i></a></li>
        
    </ul>



	<div class="powered-by" name="不蒜子" sytle="font-size:12px">
		<i class="icon icon-users"></i>
		<span id="busuanzi_container_site_uv">
			总访客 : <span id="busuanzi_value_site_uv"></span>
		</span><br/>
		<i class="icon icon-eye-fill"></i>
		<span id="busuanzi_container_site_pv">
		    总阅读 : <span id="busuanzi_value_site_pv"></span>
		</span>
	</div>
    
	<div class="copyright" name="作者">
		
		<div class="publishby">
			Theme by <a href="https://github.com/cofess" target="_blank"> cofess </a>base on <a href="https://github.com/cofess/hexo-theme-pure" target="_blank">pure</a>.
		</div>
	</div>

</footer>
  <script src="//cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>

<script>
	window.jQuery || document.write('<script src="js/jquery.min.js"><\/script>')

		<!-- 百度统计 -script.ejs --> 
		var _hmt = _hmt || [];
		(function() {
		  var hm = document.createElement("script");
		  hm.src = "https://hm.baidu.com/hm.js?e003775b21b75a71e1396c1fc395cce7";
		  var s = document.getElementsByTagName("script")[0]; 
		  s.parentNode.insertBefore(hm, s);
		})();

		<!-- 新浪云防盗链 -->
		var link = "" ;
		setTimeout( function(){
			$("img").each( (i,o) => {
				var o = $(o);
				if(o.attr("src").indexOf("sinaimg") > 0 ){
					o.attr("referrerpolicy","no-referrer");
					link = o.attr("src");
					o.attr("src",link);
				}
			});
		},1000);

</script>

<script src="/js/plugin.min.js"></script>
<script src="/js/application.js"></script>

    <script>
(function (window) {
    var INSIGHT_CONFIG = {
        TRANSLATION: {
            POSTS: '文章',
            PAGES: '页面',
            CATEGORIES: '分类',
            TAGS: '标签',
            UNTITLED: '(未命名)',
        },
        ROOT_URL: '/',
        CONTENT_URL: '/content.json',
    };
    window.INSIGHT_CONFIG = INSIGHT_CONFIG;
})(window);
</script>
<script src="/js/insight.js"></script>






	
   
<script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>




   
    
  <script src="//cdn1.lncld.net/static/js/3.0.4/av-min.js"></script>
  <script src="//cdn.jsdelivr.net/npm/valine"></script>
  <script type="text/javascript">
  var GUEST = ['nick', 'mail', 'link'];
  var meta = 'nick,mail,link';
  meta = meta.split(',').filter(function(item) {
    return GUEST.indexOf(item) > -1;
  });
  new Valine({
    el: '#vcomments',
    verify: false,
    notify: false,
    appId: 'ksrz2lYRLkGCOqMraVC2gBB3-gzGzoHsz',
    appKey: 'ehlbHl0wgN6gbvN4NQexYxnl',
    placeholder: '说点什么吧？',
    avatar: 'robohash',
    meta: meta,
    pageSize: '10' || 10,
    visitor: true
  });
  </script>

     







</body>
</html>